組合語言是最接近底層的語言,雖然現在用到的地方越來越少,連韌體都可以用 C 語言來寫,但我認為學習底層語言對寫程式還是有幫助的,可以藉由學習組合語言更了解電腦核心的運作方式,程式經過編譯後產生的指令是如何載入記憶體並被 CPU 執行,如此我們便能用更接近機器的思維來寫其他高階的程式語言。
學習組合語言也是希望自己能看懂反組譯出來的程式碼,在網路上看到介紹程式底層的文章大多會涉及組合語言,每次因為看不懂而無法更深入理解,就會覺得非常可惜,因此決定趁這個機會好好學習這門艱澀難懂的技術,就讓我們開始吧。
本系列文章主要介紹 8086 CPU 下的 16 位元 DOS 組合語言
,8086 雖然是 16 位元的 CPU 但和現代 CPU 結構上差異不大,適合初學者學習,有 16 位元的基礎後,再學 32 和 64 位元很快就能上手,就和第一個程式語言總是特別難學一樣。
組合語言的原始碼需要經過 組譯
和 連結
才會變成 .exe
執行檔。
組譯和Debug相關程式
masm.exe
: 將 .asm 組譯成 .obj 檔案link.exe
: 將 .obj 檔案連結後變成 .exe 執行檔ml.exe
: masm.exe + link.exe 方便我們快速組譯和連結dosxnt.exe
: 使用 masm.exe 組譯時需要debug.exe
: debug 會用到前四個我是到這個 網站 下載,網站左邊選單 相關檔案下載
內的 Bin.zip
。
而 debug.exe
Win10 環境已經沒有,網路上有找到一些連結但怕有病毒不敢下載,所以最後用虛擬機安裝了 XP,然後到 WINDOWS/System32
資料夾內將程式複製出來。
DOSbox
因為 debug.exe
無法在 Win10 執行,所以需要安裝 DOSbox 模擬器,下載 連結。
測試時另外發現下載的 link.exe 也需要模擬器才能執行。[1]
MOUNT
指令將工作目錄掛載到 DOSbox 的 C:
上,D:\asm 是工作目錄的路徑。C:
上。MOUNT C D:\asm
C:
為了避免每次開啟需都要輸入指令,可以將指令加入設定檔,以後開啟程式後就會自動執行這兩行指令。
C:\Program Files (x86)\DOSBox-0.74
DOSBox 0.74-2 Options.bat
[autoexec]
加入上方指令不免俗的也要來一個 Hello World 程式,不過大家不必現在就去了解程式碼含意,在之後的文章中會陸續和大家介紹。
首先將上面準備的程式都放入 D:\asm
資料夾,並新增 hello.asm
。
在 hello.asm 加入程式碼:
; 定義數據段,存放數據
data segment
; db 是定義接下來的數據為單字節的意思,
; '$'是字串的結尾,類似 C 的 '\0'
string db 13,10,'Hello World!',13,10,'$'
data ends
; 定義代碼段,執行的程式碼
code segment
; 偽指令,告訴組譯器代碼段的對應
assume cs:code, ds:data
start:
mov ax, data ; 將 data 的地址放到 ax 暫存器
mov ds, ax ; 將 ax 的值放到 ds 暫存器
lea dx, string ; 將 string 變數的地址放進 dx 暫存器
mov ah, 09h ; 09h 對應的是將字串輸出到螢幕上
int 21h ; 調用系統功能,對應的是目前 ah 暫存器中的值
mov ax, 4c00h ; 退出程式
int 21h ; 調用系統功能
code ends
end start ; 讓組譯器知道程式的進入點
開啟 DOSBox 執行下方 masm 指令,成功後可以看到資料夾多了一個 HELLO.OBJ
檔案。
masm hello.asm
接著執行 link 連結 obj 檔案,成功後就會看到 HELLO.EXE
執行檔。
link hello.obj
執行檔無法在 Win10 執行,所以需要在 DOSBox 中開啟。
hello.exe
成功完成了我們的第一個 Hello World 程式!!!
第一篇先將環境設定好,並完成了第一個 Hello World 程式,下一篇會開始介紹理論,今天就到這裡摟,感謝大家觀看。
[1] Windows10下搭建汇编语言开发环境(利用DOSBOX和MASM32)
[2] 汇编与逆向基础:Windows 7 64位环境下搭建汇编开发环境
好文! 在Visual studio code可以安裝擴充套件MASM/TASM以執行ASM code。
謝謝!